# -*- coding: utf-8 -*-
# @Time    : 2024/6/24 10:19
# @Author  : yujiahao
# @File    : 05_pandas_custom_functions.py
# @description:pandas自定义函数


'''

如果想要应用自定义的函数，或者把其他库中的函数应用到 Pandas 对象中，有以下三种方法：

    1) 操作整个 DataFrame 的函数：pipe()
    2) 操作行或者列的函数：apply()
    3) 操作单一元素的函数：applymap()

    如何从上述函数中选择适合的函数，这取决于函数的操作对象

'''

import pandas as pd
import numpy as np


# 自定义函数
def adder(ele1, ele2):
    return ele1 + ele2


def main():
    # todo 1、 操作整个数据表
    '''通过给 pipe() 函数传递一个自定义函数和适当数量的参数值，从而操作 DataFrme 中的所有元素。下面示例，实现了数据表中的元素值依次加 3。'''
    # 操作DataFrame，np.random.randn(4, 3)是身材4行三列的随机数数组
    df = pd.DataFrame(np.random.randn(4, 3), columns=['c1', 'c2', 'c3'])
    # 相加前
    print(df)
    # 相加后
    print(df.pipe(adder, 3))

    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')

    # todo 2、操作行或列

    '''如果要操作  DataFrame 的某一行或者某一列，可以使用 apply() 方法，该方法与描述性统计方法类似，都有可选参数 axis，并且默认按列操作。'''
    df = pd.DataFrame(np.random.randn(5, 3), columns=['col1', 'col2', 'col3'])
    # 求每一列中，最大值与最小值之差
    print(df.apply(lambda x: x.max() - x.min()))

    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')

    # todo 3、操作单一元素
    '''DataFrame 数据表结构的 applymap() 和 Series 系列结构的 map() 类似，它们都可以接受一个 Python 函数，并返回相应的值。'''

    # 自定义函数lambda函数
    print(df['col1'].map(lambda x: x * 100))

    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')
    # 可能会被弃用，推荐使用map
    print(df.applymap(lambda x: x * 10))

if __name__ == '__main__':
    main()
